package com.zyf.chapter02.creation.builder;

import java.util.Objects;

/**
 * 使用建造者模式对其重构
 * <p> 需求：当 isRef 为 true 的时候，arg 表示 String 类型的 refBeanId，
 * type 不需要设置；当 isRef 为 false 的时候，arg、type 都需要设置
 * @author yifeng
 */
public class ConstructorArg {
        private boolean isRef;
        private Class type;
        private Object arg;

        // 私有化构造器
        private ConstructorArg(Builder builder) {
            this.isRef = builder.isRef;
            this.type = builder.type;
            this.arg = builder.arg;
        }

        public static class Builder {
            private boolean isRef;
            private Class type;
            private Object arg;

            public ConstructorArg build() {
                // 当 isRef 为 false 的时候，arg、type 都需要设置
                if (!isRef && Objects.isNull(arg) && Objects.isNull(type)) {
                    throw new IllegalArgumentException("...");
                }
                // 当 isRef 为 true 的时候，arg 表示 String 类型的 refBeanId，type 不需要设置
                if (isRef && !(arg instanceof String) && Objects.nonNull(type)) {
                    throw new IllegalArgumentException("...");
                }
                return new ConstructorArg(this);
            }

            public Builder setRef(boolean ref) {
                isRef = ref;
                return this;
            }

            public Builder setType(Class type) {
                this.type = type;
                return this;
            }

            public Builder setArg(Object arg) {
                this.arg = arg;
                return this;
            }
        }
    }